/* $Id: route.h,v 1.9 1993/06/04 11:16:15 jraja Exp $
 *
 * Copyright (c) 1993 AmiTCP/IP Group, <amitcp-group@hut.fi>,
 *                    Helsinki University of Technology, Finland.
 *                    All rights reserved.
 *
 * route.h --- Generic Routing Routines
 *
 * Last modified: Fri Jun  4 00:39:43 1993 jraja
 *
 * HISTORY
 * $Log: route.h,v $
 * Revision 1.9  1993/06/04  11:16:15  jraja
 * Fixes for first public release.
 *
 * Revision 1.8  1993/05/29  20:44:42  jraja
 * Removed obsolete definitions.
 *
 * Revision 1.7  1993/05/16  21:09:43  ppessi
 * RCS version changed.
 *
 * Revision 1.6  1993/05/03  10:26:28  jraja
 *  Put some KERNEL specific definitions inside #ifdef KERNEL ... #endif
 *
 * Revision 1.5  93/05/02  17:32:02  17:32:02  jraja (Jarno Tapio Rajahalme)
 * Removed some obsolete definitions,
 * included protos from distinct proto file here.
 * 
 * Revision 1.4  93/04/05  17:47:28  17:47:28  jraja (Jarno Tapio Rajahalme)
 * Commneted out #include <gateway.h> since every c-file includes
 * conf.h which contains the definition for GATEWAY.
 * 
 * Revision 1.3  93/03/05  03:12:54  03:12:54  ppessi (Pekka Pessi)
 * Compiles with SASC. Initial test version
 * 
 * Revision 1.2  93/02/25  16:50:25  16:50:25  jraja (Jarno Tapio Rajahalme)
 * added inclusion of route prototypes at the end of the file.
 * 
 * Revision 1.1  92/11/20  14:59:28  14:59:28  jraja (Jarno Tapio Rajahalme)
 * Initial revision
 * 
 *
 */

/* 
 * Mach Operating System
 * Copyright (c) 1992 Carnegie Mellon University
 * All Rights Reserved.
 * 
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 * 
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 * 
 * Carnegie Mellon requests users of this software to return to
 * 
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 * 
 * any improvements or extensions that they make and grant Carnegie Mellon 
 * the rights to redistribute these changes.
 */
/*
 * HISTORY
 * Log: route.h,v
 * Revision 2.1  92/04/21  17:13:52  rwd
 * BSDSS
 * 
 *
 */

/*
 * Copyright (c) 1980, 1986 Regents of the University of California.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed by the University of
 *      California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *      @(#)route.h     7.13 (Berkeley) 4/25/91
 */

MODULE 'exec/tasks'

/*
 * Kernel resident routing tables.
 * 
 * The routing tables are initialized when interface addresses
 * are set by making entries for all directly connected interfaces.
 */

/*
 * A route consists of a destination address and a reference
 * to a routing entry.  These are often held by protocols
 * in their control blocks, e.g. inpcb.
 */
OBJECT route
    ro_rt:PTR TO rtentry,
    ro_dst:sockaddr


/*
 * These numbers are used by reliable protocols for determining
 * retransmission behavior and are included in the routing structure.
 */
OBJECT rt_metrics
    rmx_locks:ULONG,      /* Kernel must leave these values alone */
    rmx_mtu:ULONG,        /* MTU for this path */
    rmx_hopcount:ULONG,   /* max hops expected */
    rmx_expire:ULONG,     /* lifetime for route, e.g. redirect */
    rmx_recvpipe:ULONG,   /* inbound delay-bandwith product */
    rmx_sendpipe:ULONG,   /* outbound delay-bandwith product */
    rmx_ssthresh:ULONG,   /* outbound gateway buffer limit */
    rmx_rtt:ULONG,        /* estimated round trip time */
    rmx_rttvar:ULONG      /* estimated rtt variance */


/*
 * rmx_rtt and rmx_rttvar are stored as microseconds;
 * RTTTOPRHZ(rtt) converts to a value suitable for use
 * by a protocol slowtimo counter.
 */
#define RTM_RTTUNIT     1000000 /* units for rtt, rttvar, as units per sec */
#define RTTTOPRHZ(r)    ((r) / (RTM_RTTUNIT / PR_SLOWHZ))

/*
 * We distinguish between routes to hosts and routes to networks,
 * preferring the former if available.  For each route we infer
 * the interface to use from the gateway address supplied when
 * the route was entered.  Routes that forward packets through
 * gateways are marked so that the output routines know to address the
 * gateway rather than the ultimate destination.
 */

#define rt_key(r)       (((r).rt_nodes.rn_key))
#define rt_mask(r)      (((r).rt_nodes.rn_mask))

OBJECT rtentry
    rt_nodes[2]:radix_node, /* tree glue, and other values */
    rt_gateway:PTR TO sockaddr,   /* value */
    rt_flags:WORD,               /* up/down?, host/net */
    rt_refcnt:WORD,              /* # held references */
    rt_use:ULONG,                 /* raw # packets forwarded */
    rt_ifp:PTR TO ifnet,          /* the answer: interface to use */
    rt_ifa:PTR TO ifaddr,         /* the answer: interface to use */
    rt_genmask:PTR TO sockaddr,   /* for generation of cloned routes */
    rt_llinfo:PTR TO BYTE,              /* pointer to link level info cache */
    rt_rmx:rt_metrics,      /* metrics used by rx'ing protocols */
    rt_idle:WORD                /* easy to tell llayer still live */

/*
 * Following structure necessary for 4.3 compatibility;
 * We should eventually move it to a compat file.
 */
OBJECT  ortentry
    rt_hash:ULONG,                /* to speed lookups */
    rt_dst:sockaddr,        /* key */
    rt_gateway:sockaddr,    /* value */
    rt_flags:WORD,               /* up/down?, host/net */
    rt_refcnt:WORD,              /* # held references */
    rt_use:ULONG,                 /* raw # packets forwarded */
    rt_ifp:PTR TO finet          /* the answer: interface to use */


#define RTF_UP          $1             /* route useable */
#define RTF_GATEWAY     $2             /* destination is a gateway */
#define RTF_HOST        $4             /* host entry (net otherwise) */
#define RTF_REJECT      $8             /* host or net unreachable */
#define RTF_DYNAMIC     $10            /* created dynamically (by redirect) */
#define RTF_MODIFIED    $20            /* modified dynamically (by redirect) */
#define RTF_DONE        $40            /* message confirmed */
#define RTF_MASK        $80            /* subnet mask present */
#define RTF_CLONING     $100           /* generate new routes on use */
#define RTF_XRESOLVE    $200           /* external daemon resolves name */
#define RTF_LLINFO      $400           /* generated by ARP or ESIS */
#define RTF_PROTO2      $4000          /* protocol specific routing flag */
#define RTF_PROTO1      $8000          /* protocol specific routing flag */


/*
 * Routing statistics.
 */
OBJECT rtstat
    rts_badredirect:WORD,        /* bogus redirect calls */
    rts_dynamic:WORD,            /* routes created by redirects */
    rts_newgateway:WORD,         /* routes modified by redirects */
    rts_unreach_WORD,            /* lookups which failed */
    rts_wildcard:WORD           /* lookups satisfied by a wildcard */
/*
 * Structures for routing messages.
 */
OBJECT rt_msghdr
    rtm_msglen:UWORD,     /* to skip over non-understood messages */
    rtm_version:UBYTE,    /* future binary compatability */
    rtm_type:UBYTE,       /* message type */
    rtm_index_UWORD,      /* index for associated ifp */
    rtm_pid:PTR TO Task,        /* identify sender */
    rtm_addrs:LONG,      /* bitmask identifying sockaddrs in msg */
    rtm_seq:LONG,        /* for sender to identify action */
    rtm_errno:LONG,      /* why failed */
    rtm_flags:LONG,      /* flags, incl. kern & message, e.g. DONE */
    rtm_use:LONG,        /* from rtentry */
    rtm_inits:ULONG,      /* which metrics we are initializing */
    rtm_rmx:rt_metrics /* metrics themselves */


OBJECT route_cb
    ip_count:LONG,
    ns_count:LONG,
    iso_count:LONG,
    any_count:LONG

#define RTM_VERSION     2       /* Up the ante and ignore older versions */

#define RTM_ADD         $1     /* Add Route */
#define RTM_DELETE      $2     /* Delete Route */
#define RTM_CHANGE      $3     /* Change Metrics or flags */
#define RTM_GET         $4     /* Report Metrics */
#define RTM_LOSING      $5     /* Kernel Suspects Partitioning */
#define RTM_REDIRECT    $6     /* Told to use different route */
#define RTM_MISS        $7     /* Lookup failed on this address */
#define RTM_LOCK        $8     /* fix specified metrics */
#define RTM_OLDADD      $9     /* caused by SIOCADDRT */
#define RTM_OLDDEL      $a     /* caused by SIOCDELRT */
#define RTM_RESOLVE     $b     /* req to resolve dst to LL addr */

#define RTV_MTU         $1     /* init or lock _mtu */
#define RTV_HOPCOUNT    $2     /* init or lock _hopcount */
#define RTV_EXPIRE      $4     /* init or lock _hopcount */
#define RTV_RPIPE       $8     /* init or lock _recvpipe */
#define RTV_SPIPE       $10    /* init or lock _sendpipe */
#define RTV_SSTHRESH    $20    /* init or lock _ssthresh */
#define RTV_RTT         $40    /* init or lock _rtt */
#define RTV_RTTVAR      $80    /* init or lock _rttvar */

#define RTA_DST         $1     /* destination sockaddr present */
#define RTA_GATEWAY     $2     /* gateway sockaddr present */
#define RTA_NETMASK     $4     /* netmask sockaddr present */
#define RTA_GENMASK     $8     /* cloning mask sockaddr present */
#define RTA_IFP         $10    /* interface name sockaddr present */
#define RTA_IFA         $20    /* interface addr sockaddr present */
#define RTA_AUTHOR      $40    /* sockaddr for author of redirect */

/*
extern struct route_cb route_cb;

#define RTFREE(rt) \
        if ((rt)->rt_refcnt <= 1) \
                rtfree(rt); \
        else \
                (rt)->rt_refcnt--;

extern struct   rtstat  rtstat;

void rtinitheads(void);
void rtalloc(struct route * ro);
struct rtentry * rtalloc1(struct sockaddr * dst, int report);
void rtfree(struct rtentry * rt);
void rtredirect(struct sockaddr * dst, struct sockaddr * gateway,
               struct sockaddr * netmask, int flags,
               struct sockaddr * src, struct rtentry ** rtp);
int rtioctl(int req, caddr_t data);
struct ifaddr * ifa_ifwithroute(int flags, struct sockaddr * dst,
                                struct sockaddr * gateway);
int rtrequest(int req, struct sockaddr * dst, struct sockaddr * gateway,
              struct sockaddr * netmask, int flags, struct rtentry ** ret_nrt);
void rt_maskedcopy(struct sockaddr * src, struct sockaddr * dst,
                  struct sockaddr * netmask);
int rtinit(struct ifaddr * ifa, int cmd, int flags);
*/
